一、jdk动态代理

动态代理分为jdk动态代理和cglib动态代理,本章讲解jdk动态代理

二、jdk动态代理如何实现

  1. 实现InvorcationHander接口,在invoke()方法实现增强
  2. 通过Proxy.newProxyInstance()方法获取到代理类
  3. 调用代理引用调用目标方法实现曾江

    三、代码实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public static void main(String[] args) {
    final Car car = new BmwCar();
    Car carProxy = (Car) Proxy.newProxyInstance(Car.class.getClassLoader(), car.getClass().getInterfaces(), new InvocationHandler() {
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    System.out.println("增强前");
    Object invoke = method.invoke(car, args);
    System.out.println("增强后");
    return invoke;
    }
    });
    carProxy.run();
    }
    结果:
    image.png

    四、实现原理

    image.png
    image.png
    image.png
    image.png
    可以看到通过Proxy.newProxyInstance()生成了目标对象的代理类,以二进制的方式加载到了内存中.
    那么代理类长什么样子呢?
    image.png
  4. 代理类继承了Proxy类并且实现了我们的car接口
  5. 在实现的run方法中,调用了h.invoke()方法
  6. 那么h是什么呢? h是 Proxy类中的属性,就是InvoketionHander接口的引用,所以jdk代理类必须实现InvoketionHander接口
    image.png
    jdk 动态代理实现图
    image.png